<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>数组中的reduce()方法</title>
</head>
<body>
<script>
  /**
   * reduce()
   * arr.reduce(callback, initialValue)
   *
   * reduce会为数组中的每个元素执行回调函数，回调函数(callback)有四个参数，分别为
   * prev: 上一次执行完返回的值(包括初始值)
   * item: 当前的元素(当前执行回调函数的元素)
   * index: 当前元素位置(下标index值)
   * arr: 原数组(执行的当前数组)
   *
   * initialValue： 可选，第一次执行回调函数的初始值(也就是第一次执行回调函数时, prev的初始值，可以给他赋值为一个[], {}或者一个数字)
   *
   * */
  /**数字求和*/
  /**
   let arr = [1, 2, 3, 4, 5];
   let sum = arr.reduce((prev, item) => {
            console.log(prev, item);
            return prev + item;
        });
   console.log(sum);
   */
  /** 添加一个初始值*/
  /**
   let arr = [1, 2, 3, 4, 5];
   let sum = arr.reduce((prev, item) => {
            console.log(prev, item);
            return prev + item;
        }, 10); // 这里设置了初始值
   console.log(sum);
   */
  // 如果没有添加初始值，第一次回调从数组的index为1的地方开始执行，而添加初始值后第一次回调从数组的index为0的地方开始执行
  /**不设置初始值会报错*/
  /**
   let arr = [1, 2, 3, 4, 5];
   let Arr = arr.reduce((prev, item) => {
            console.log(prev, item);
            prev.push(item);
            return prev;
        }, []); // 设置初始值后
   console.log(Arr);
   */
  // 使用的时候最好给一个初始值，否则会报错
  // reduce() 作用
  /**1. 数字求和，上面已经介绍*/
  /**2. 数字阶乘*/
  /**
   let arr = [1, 2, 3, 4, 5];
   let sum = arr.reduce((prev, item) => {
            console.log(prev, item);
            return prev * item;
        }, 1);
   console.log(sum);
   */
  /**3. 数组去重*/
  /**
   let Arr = [1, 3, 2, 2, 4, 5]
   let arr = Arr.reduce((prev, item) => {
            if (!prev.includes(item)){
             prev.push(item);
            }
            return prev;
        }, []);
   console.log(arr);
   */
  /*4. 计算数组中每个元素出现的个数*/
  /**
   let Arr = [1, 3, 2, 2, 4, 5];
   let arr = Arr.reduce((prev, item) => {
            if (item in prev) {
                prev[item]++;
            } else {
                prev[item] = 1;
            }
            return prev;
        }, {});
   console.log(arr);
   */
  /*5. 除去数组中的嵌套数组*/
  /***
   let Arr = [[2, 5, 9], [0, 3]];
   let arr = Arr.reduce((prev, item) => {
            // 使用concat() 或者[...]将两个数组合并
            // let as = prev.concat(item);
            let as = [...prev, ...item];
            return as;
        }, []);
   console.log(arr);
   */
</script>
</body>
</html>
